﻿# define _CRT_SECURE_NO_WARNINGS 1
//正⽂开始
//1. 递归是什么？
//递归是学习C语⾔函数绕不开的⼀个话题，那什么是递归呢？
//递归其实是⼀种解决问题的⽅法，在C语⾔中，递归就是函数⾃⼰调⽤⾃⼰。
//写⼀个史上最简单的C语⾔递归代码
#include <stdio.h>
//int main()
//{
//	printf("hehe\n");
//	main();
//	return 0;
//}
//1.1 递归的思想：
//把⼀个⼤型复杂问题层层转化为⼀个与原问题相似，但规模较⼩的⼦问题来求解；直到⼦问题不能再
//被拆分，递归就结束了。所以递归的思考⽅式就是把⼤事化⼩的过程。
//递归中的递就是递推的意思，归就是回归的意思，接下来慢慢来体会
//1.2 递归的限制条件
//递归在书写的时候，有2个必要条件：
//• 递归存在限制条件，当满⾜这个限制条件的时候，递归便不再继续。
//• 每次递归调⽤之后越来越接近这个限制条件
//2.1.1 分析和代码实现
//列子：求n的阶乘，递归的方法
//i/*nt face(int n)
//{
//	if (n == 0)
//		return 1;
//	else
//		return n*face(n - 1);
//}
//int main()
//{
//	int n = 0;
//	scanf("%d",&n);
//	int ret = face(n);
//	printf("%d\n", ret);
//	return 0;
//}*/
//求n的阶乘（非递归的方法）
//int face(int n)
//{
//	int i = 0;
//	int c = 1;
//	for (i = 1; i <= n; i++)
//	{
//		c *= i;
//	}
//	return c;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int ret = face(n);
//	printf("%d\n", ret);
//	return 0;
//}
//2.2 举例2：顺序打印⼀个整数的每⼀位
//输⼊⼀个整数m，按照顺序打印整数的每⼀位。
//⽐如：
//输⼊：1234输出：1234
//输⼊：520输出：520
//void print(int m)
//{
//	if (m > 9)
//	{
//		print(m / 10);
//	}
//	printf("%d ", m % 10);
//}
//int main()
//{
//	int m = 0;
//	scanf("%d", &m);
//	print(m);
//	return 0;
//}
////举例3：求第n个斐波那契数
//斐波那契数：1，1，2，3，5，8，13，21，34，55，89，144
//int count = 0;
//int fib(int m)
//{
//	if (m <= 2)
//		return 1;
//	else
//		return fib(m - 1) + fib(m - 2);
//}
//int main()
//{
//	int m = 0;
//	scanf("%d", &m);
//	int ret = fib(m);
//	printf("%d", ret);
//	return 0;
//}
//int fib(int n)
//{
//	int a = 1;
//	int b = 1;
//	int c = 1;
//	while (n >= 3)
//	{
//		c = a + b;
//		a = b;
//		b = c;
//		n--;
//	}
//	return c;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d",&n);
//	int ret = fib(n);
//	printf("%d", ret);
//	return 0;
//}
//编写一个函数实现n的k次方，使用递归实现。
//int okk(int n,int k)
//{
//	if (k == 0)
//		return 1;
//	else
//		return n * okk(n, k - 1);
//}
//int main()
//{
//	int n = 0;
//	int k = 0;
//	scanf("%d %d", &n,&k);
//	int ret = okk(n,k);
//	printf("%d", ret);
//	return 0;
//}
//写一个递归函数DigitSum(n)，输入一个非负整数，返回组成它的数字之和

//例如，调用DigitSum(1729)，则应该返回1 + 7 + 2 + 9，它的和是19
//
//输入：1729，输出：19
int Digitsum(int n)
{
	int sum = n % 10;
	if (n <10 )
	{
		return n;
	}
	return sum + Digitsum(n / 10);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Digitsum(n);
	printf("%d", ret);
	return 0;
}
//vs实用调试技巧
//第8讲：VS实⽤调试技巧
//⽬录
//1. 什么是bug？程序漏洞
//2. 什么是调试？调试，英⽂叫debug（消灭bug）的意思
//3. debug和release
//4. VS调试快捷键
// F9：创建断点和取消断点
//断点的作⽤是可以在程序的任意位置设置断点，打上断点就可以使得程序执⾏到想要的位置暂停执
//⾏，接下来我们就可以使⽤F10，F11这些快捷键，观察代码的执⾏细节。
//条件断点：满⾜这个条件，才触发断点F5：启动调试，经常⽤来直接跳到下⼀个断点处，⼀般是和F9配合使⽤。
//F10：逐过程，通常⽤来处理⼀个过程，⼀个过程可以是⼀次函数调⽤，或者是⼀条语句。
//F11：逐语句，就是每次都执⾏⼀条语句，但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。在函
//数调⽤的地⽅，想进⼊函数观察细节，必须使⽤F11，如果使⽤F10，直接完成函数调⽤。
//CTRL + F5：开始执⾏不调试，如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。
////VS更多快捷键了解：
//5. 监视和内存观察
//int main()
//{
//	int arr[10] = { 0 };
//	int num = 100;
//	char c = 'w';
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		arr[i] = i;
//	}
//	return 0;
//}
//除此之外，在调试的窗⼝中还有：⾃动窗⼝，局部变量，反汇编、寄存器等窗⼝，⾃⾏验证使⽤⼀
//下。
//6. 调试举例1；求 1!+2!+3!+4!+...10! 的和，请看下⾯的代码：
//int main()/*求n的阶乘*/
//{
//	int n = 0;
//	scanf("%d", &n);
//	int i = 1;
//	int ret = 1;
//	for (i = 1; i <= n; i++)
//	{
//		ret *= i;
//	}
//	printf("%d\n", ret);
//	return 0;
//}
//求1到10每个数的阶乘的和
//int main()
//{
//	int n = 0;
//	int i = 0;
//	int sum = 0;
//	for (n = 1; n <= 10; n++)
//	{
//		int ret = 1;
//		for (i = 1; i <= n; i++)
//		{
//			ret *= i;
//		}
//		sum += ret;
//	}
//	printf("%d\n", sum);
//	return 0;
//}
//7. 调试举例2
//#include <stdio.h>
//int main()
//{
//	int i = 0;
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	for (i = 0; i <= 10; i++)
//	{
//		arr[i] = 0;
//		printf("hehe\n");
//	}
//	printf("%zu", &i);
//	printf("%zu", &arr[12]);
//	return 0;
//}
//8. 调试举例3：扫雷
//9. 编程常⻅错误归类
//9.1 编译型错误
//9.2 链接型错误：
//• 标识符名不存在
//• 拼写错误
//• 头⽂件没包含
//• 引⽤的库不存在
//9.3 运⾏时错误
//#include <stdio.h>
//int main()
//{
//    int i = 0;
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    for (i = 0; i <= 12; i++)
//    {
//        arr[i] = 0;
//        printf("hello bit\n");
//    }
//    return 0;
//}
